﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "GcmpApiDeclaration.h"
#include <regex>

namespace gcmp
{
    class ISpecificStandardCodeSystem;
    class IStandardCodeItem;

    /// \brief 标准的代理接口。
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IStandardCodeSystemProxy
    {
    public:
        virtual ~IStandardCodeSystemProxy();

    public:
        /// \brief 获取标准的代理对象。
        static IStandardCodeSystemProxy* Get();

        /// \brief 设置用户使用的特定标准的访问接口。
        /// 用户需要在使用标准数据前将标准访问接口对象设置完，否则获取不到标准数据。例如程序启动时设置一次。
        /// \param opSpecificStandardCodeSystem 用户使用的特定标准的访问接口。
        /// \param version 设置后需要获取的标准数据的版本
        /// \param pErrorMessage 输出参数。如果返回false，则该参数输出错误信息。
        /// \return 成功则返回true；失败则返回false。
        virtual bool SetSpecificStandardCodeSystem(OwnerPtr<ISpecificStandardCodeSystem> opSpecificStandardCodeSystem, int version, std::wstring* pErrorMessage) = 0;

        /// \brief 获取用户设置的特定标准
        /// \return 返回特定标准。如果没有通过SetSpecificStandardCodeSystem()设置过，返回nullptr。
        /// \see SetSpecificStandardCodeSystem()
        virtual const ISpecificStandardCodeSystem * GetSpecificStandardCodeSystem() const = 0;

        /// \brief 通过编码表查询对应的所有的编码, 包括了下一级的子编码
        /// \param tableId 编码表。
        /// \return 返回编码表对应的所有编码的map，其中key为编码，value为IStandardCodeItem的指针。
        virtual std::unordered_map<std::wstring, const IStandardCodeItem*> GetAllCodesByTableId(const std::wstring& tableId) const = 0;
        
        /// \brief 通过编码表查询对应的所有的编码助记符, 包括了下一级的子编码的助记符
        /// \param tableId 编码表。
        /// \return 返回编码表对应的所有助记符的map，其中key为编码助记符，value为IStandardCodeItem的指针。
        virtual std::unordered_map<std::wstring, const IStandardCodeItem*> GetAllCodeMnemonicsByTableId(const std::wstring& tableId) const = 0;
        
        /// \brief 通过正则表达式查询相关编码，只要满足正则表达式，返回的编码也可能是子编码
        /// \param regexExp c++的正则表达式，可以自己在regexExp中定义正则表达式的语法标准。
        /// \return 返回编码表对应的所有编码的map，其中key为编码，value为IStandardCodeItem的指针。
        virtual std::unordered_map<std::wstring, const IStandardCodeItem*> GetAllCodesByRegularExpression(const std::wregex& regexExpression) const = 0;
        
        /// \brief 通过正则表达式查询相关编码助记符，只要满足正则表达式，返回的编码助记符也可能是子编码的助记符
        /// \param regexExp c++的正则表达式，可以自己在regexExp中定义正则表达式的语法标准。
        /// \return 返回所有助记符的map，其中key为编码助记符，value为IStandardCodeItem的指针。
        virtual std::unordered_map<std::wstring, const IStandardCodeItem*> GetAllCodeMnemonicsByRegularExpression(const std::wregex& regexExpression) const = 0;

        /// \brief 通过编码值获取一个编码数据对象。
        /// \param codeValue 编码值
        /// \return 返回编码值对应的编码数据对象。
        virtual const IStandardCodeItem* GetStandardCodeItemByCode(const std::wstring& codeValue) const = 0;
        
        /// \brief 通过编码助记符获取一个编码数据对象。
        /// \param codeMnemonic 编码助记符
        /// \return 返回编码助记符对应的编码数据对象。
        virtual const IStandardCodeItem* GetStandardCodeItemByCodeMnemonic(const std::wstring& codeMnemonic) const = 0;
    };
}
